home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’95 / INIT ThemeSong / AsyncTest.Asm < prev    next >
Encoding:
Assembly Source File  |  1995-06-24  |  5.4 KB  |  305 lines  |  [TEXT/QED1]

  1. ;            .VERBOSE
  2.  
  3.     INCLUDE    HGMacs.Txt
  4.     INCLUDE    PackMacs.Txt
  5.     INCLUDE    Traps.D
  6.     INCLUDE    SysEquX.D
  7.     INCLUDE    FSEqu.D
  8. ;    INCLUDE    ToolEqu.D
  9. AppParmHandle EQU    $AEC    ;not in the MDS 2.0 equates
  10. .TRAP    _DebugStr    $ABFF
  11. .TRAP    _SCSIDispatch $A815
  12. scsiStat    EQU    10
  13.     .MACRO    _SCSIStat
  14.     MOVE.W    #scsiStat,-(A7)
  15.     _SCSIDispatch
  16.     .ENDM
  17.  
  18. sndRefNum    EQU    -4
  19. hloc    EQU    100
  20. vloc    EQU    100
  21. buffsize    EQU    512*22
  22. N    EQU    2    ;number of buffers
  23. vblSize    EQU    vblPhase+2
  24. ffMode    EQU    0
  25.  
  26.     RECORD    0,INCREMENT
  27. extlen$    VAR    4
  28. MACRO    extlen    =|    ;use (An) addressing
  29. extptr    VAR    4
  30. rate    VAR    4
  31. datahndl    VAR    4    ;used by init only
  32. codehndl    VAR    4    ;used by init only
  33. taskcount    VAR    2
  34.     ALGN    0,4    ;for '020 efficiency
  35. hdrsize    ENDR
  36.  
  37.     RECORD    0,INCREMENT
  38.     FILL    ioQElSize
  39. vblQEl1    VAR    vblSize
  40. sndPB    VAR    ioQElSize
  41. vblQEl2    VAR    vblSize
  42.     FILL    4    ;for rate -- mode overlaps vblPhase
  43. readbuff    VAR    buffsize
  44. overrun    VAR    368
  45.     ALGN    0,4    ;for '020 efficiency
  46. blksize    ENDR
  47.  
  48. ratevalue    EQU    $00010000
  49. zR    EQU    D7
  50.  
  51.     LINK    A6,#-(rName+64)
  52.     MOVEQ    #0,zR
  53.     PEA    -4(A5)
  54.     _InitGraf
  55.     _InitFonts
  56.     _InitWindows
  57.     _InitMenus
  58.     MOVE.L    AppParmHandle,A0
  59.     _HLock
  60.     MOVE.L    (A0),A4
  61.  
  62.     MOVE.L    #ratevalue,D6
  63.     MOVE.W    (A4)+,D0    ;message: 0 = Open, 1 = Print
  64.     LSR.L    D0,D6
  65.     MOVE.W    (A4)+,D4    ;count of files
  66.     BEQ.S    useSF
  67.     SUBQ.W    #1,D4
  68. @dofile
  69.     MOVE.W    (A4)+,D3    ;volume ref num
  70.     ADDQ    #6,A4    ;skip over file type & version number
  71.     BSR.S    dofile
  72.     MOVEQ    #1,D0
  73.     OR.B    (A4)+,D0    ;length byte
  74.     ADDA.L    D0,A4    ;skip over file name
  75.     DBRA    D4,@dofile
  76.     UNLK    A6
  77.     RTS
  78. useSF
  79.     MOVE.L    A7,A4
  80.     MOVE.L    #vloc<<16+hloc,-(SP)    ;where
  81.     SUBQ    #4,SP    ;prompt--not used
  82.     MOVE.L    zR,-(SP)    ;fileFilter
  83.     MOVE.W    #1,-(SP)    ;numTypes
  84.     PEA    typeList    ;typeList
  85.     MOVE.L    zR,-(SP)    ;dlgHook
  86.     MOVE.L    A4,-(SP)    ;reply
  87.     _SFGetFile
  88.     TST.B    (A4)    ;rGood
  89.     BEQ.S    @cancel
  90.     MOVE.W    rVolume(A4),D3
  91.     LEA    rName(A4),A4
  92.     BSR.S    dofile
  93.     BRA.S    useSF
  94. @cancel
  95.     UNLK    A6
  96.     RTS
  97. typeList    DC.W    'FSSD'
  98.  
  99. openerr:
  100.     MOVE.W    D0,D1
  101.     MOVE.L    A3,A0
  102.     _DisposPtr
  103.     MOVE.W    D1,D0
  104. nomem:
  105.     NEG.W    D0
  106.     MOVE.W    D0,-(A7)
  107.     _SysBeep
  108.     UNLK    A6
  109.     RTS
  110. dofile
  111.     LINK    A6,#-evtBlkSize
  112.     MOVE.L    #hdrsize+N*blkSize,D0
  113.     _NewPtr
  114.     BNE    nomem
  115.     MOVEA.L    A0,A3
  116.     LEA    hdrsize(A3),A0
  117.     MOVE.L    A3,A2
  118.     MOVEQ    #(hdrsize+readbuff)/4-1,D1
  119. @clr    MOVE.L    zR,(A2)+    ;faster than CLR.L
  120.     DBRA    D1,@clr    ;A2 points to readbuff
  121.  
  122.     MOVE.W    #N,taskcount(A3)
  123.     MOVE.L    D6,rate(A3)
  124.  
  125.     MOVE.B    #fsRdPerm,ioPermssn(A0)
  126.     MOVE.W    D3,ioVRefNum(A0)
  127.     MOVE.L    A4,ioFileName(A0)
  128.     _Open
  129.     BNE.S    openerr
  130.     MOVE.L    A3,ioOwnBuf(A0)
  131.     MEA1    readcomp,ioCompletion(A0)
  132.     MOVE.L    A2,ioBuffer(A0)    ;points to readbuff
  133.     MOVE.L    #buffsize,ioReqCount(A0)
  134. ;    CLR.W    ioPosMode(A0)    ;= fsAtMark
  135.     MOVE.W    #sndRefNum,sndPB+ioRefNum(A0)
  136.     MEA1    sndcomp,sndPB+ioCompletion(A0)
  137.     ADDQ.W    #vType,vblQEl1+qType(A0)
  138.     ADDQ.W    #vType,vblQEl2+qType(A0)
  139.     MEA1    vbltask1,vblQEl1+vblAddr(A0)
  140.     MEA1    vbltask2,vblQEl2+vblAddr(A0)
  141.     ADDQ.W    #1,vblQEl2+vblCount(A0)
  142.  
  143.     _Read    ,ASYNC
  144.     MOVE.L    A0,A2
  145.     MOVEQ    #N-2,D1
  146.     MOVE.L    #blksize,D5
  147. @top
  148.     MOVE.L    #readbuff,D0
  149.     LEA    0(A0,D5.L),A1
  150.     _BlockMove
  151.     ADD.L    D5,ioBuffer(A1)
  152.     MOVE.L    A1,A0
  153.     _Read    ,ASYNC
  154.     DBRA    D1,@top
  155. @0    _SystemTask
  156.     SUBQ    #2,A7        ;func result:BOOLEAN
  157.     MOVE.W    #$FFFF,-(A7)    ;eventMASK:INTEGER
  158.     PEA    -evtBlkSize(A6)    ;VAR theEvent
  159.     _GetNextEvent
  160.     TST.B    (A7)+
  161.     BEQ.S    @1
  162.     SUBQ.W    #keyDwnEvt,(A7)    ;evtNum
  163.     BNE.S    @1
  164.     CMPI.B    #'.',-evtBlkSize+evtMessage+3(A6)
  165.     BNE.S    @1
  166.     BTST    #cmdKey,-evtBlkSize+evtMeta(A6)
  167.     BEQ.S    @1
  168. @7
  169.     MOVE.L    A2,A0
  170.     MOVEQ    #N-1,D1
  171. @8
  172.     MOVE.L    zR,ioReqCount(A0)
  173.     MOVE.L    zR,sndPB+ioReqCount(A0)
  174.     ADDA.L    D5,A0
  175.     DBRA    D1,@8
  176. @1
  177.     TST.W    taskcount(A3)
  178.     BNE.S    @0
  179.     MOVE.L    A2,A0
  180.     _Close
  181.     MOVE.L    A3,A0
  182.     _DisposPtr
  183.     BEQ.S    @ok
  184.     _Debugger        ;should never occur
  185. @ok    UNLK    A6
  186.     RTS
  187.     DC.W    'Copyright © 1990 Harvey Grosser'
  188.  
  189.  
  190. readcomp:
  191.  
  192. countR    EQU    D1
  193. MACRO    extR    =D2|    ;EQU doesn't work properly in MOVEM or index reg.
  194.  
  195.     MOVE.L    A3,-(A7)
  196.     MOVE.L    ioOwnBuf(A0),A3
  197.     MOVEM.L    extlen(A3),extR/A1
  198.     MOVE.L    ioActCount(A0),countR
  199.     CMP.L    extR,countR
  200.     BGT.S    @gtov
  201.  
  202.     SUBQ.W    #1,taskcount(A3)
  203. ;    BNE.S    @more
  204. ;    MEA1    closed,ioCompletion(A0)    ;used by init
  205. ;    _Close    ,ASYNC        ;we do it synchronously
  206. ;    BRA.S    @restore
  207. ;@more
  208.     LEA    readbuff(A0),A0
  209.     MOVE.L    countR,D0
  210.     _BlockMove
  211.     MOVE.L    D0,extlen(A3)  ;better than CLR.L on 68000
  212.     ADDA.L    countR,A1
  213.     SUB.L    countR,extR
  214.  
  215.     MOVE.L    #$80808080,D0
  216.     MOVEQ    #3,countR
  217.     AND.W    extR,countR
  218.     BRA.S    @1
  219. @0    MOVE.B    D0,(A1)+
  220. @1    DBRA    countR,@0
  221.     LSR.W    #3,extR
  222.     BCS.S    @3
  223.     BRA.S    @4
  224. @2    MOVE.L    D0,(A1)+
  225. @3    MOVE.L    D0,(A1)+
  226. @4    DBRA    extR,@2
  227.  
  228.     BRA.S    @restore
  229. @gtov
  230.     ;amount read is greater than previous overrun
  231.     LEA    readbuff(A0),A0
  232.     MOVE.L    extR,D0
  233.     _BlockMove
  234.     LEA    -6(A0,extR),A1
  235.     LEA    sndPB-readbuff(A0),A0
  236.     MOVE.L    A1,ioBuffer(A0)
  237.     MOVE.W    D0,(A1)+    ;D0 = 0 (ffMode) from BlockMove
  238.     MOVE.L    rate(A3),(A1)+
  239.     SUB.L    extR,countR    ;amount left in buffer
  240.     ADDA.L    countR,A1    ;point beyond data just read
  241.     MOVE.L    #370<<16,extR    ;largest possible dividend + 1
  242.     SUB.L    countR,extR
  243.     DIVU    #370,extR
  244.     CLR.W    extR
  245.     SWAP    extR
  246.     ADD.L    extR,countR
  247.  
  248.     MOVE.L    countR,ioReqCount(A0)
  249.     _Write    ,ASYNC
  250.  
  251.     MOVEM.L    extR/A1,extlen(A3)
  252. @restore
  253.     MOVE.L    (A7)+,A3
  254.     RTS
  255.  
  256.  
  257. sndcomp:
  258.     BEQ.S    @nokill        ;test for _KillIO
  259.     CLR.L    ioReqCount-sndPB(A0)    ;terminate on _KillIO
  260. @nokill    MOVE.B    #$80,SoundLevel    ;eliminate end click on Mac SE
  261.     TST.B    FSBusy
  262.     BNE.S    @read
  263.     LEA    vblQEl1-sndPB(A0),A0
  264.     ADDQ.W    #1,vblCount(A0)
  265.     _VInstall
  266.     RTS
  267. @read
  268.     LEA    -sndPB(A0),A0
  269.     _Read    ,ASYNC
  270.     RTS
  271.  
  272.  
  273. vbltask1:
  274.     TST.B    FSBusy
  275.     BNE.S    @read
  276.     MOVE.L    A0,A2
  277.     SUBQ    #2,A7
  278.     _SCSIStat
  279.     TST.W    (A7)+
  280.     BEQ.S    @scsifree
  281.     ADDQ.W    #1,vblCount(A2)
  282.     RTS
  283. @scsifree
  284.     LEA    vblQEl2-vblQEl1(A2),A0
  285.     LEA    VBLQueue,A1
  286.     _Enqueue
  287.     RTS
  288. @read
  289.     LEA    -vblQEl1(A0),A0
  290.     _Read    ,ASYNC
  291.     RTS
  292.  
  293.  
  294. vbltask2:
  295.     _VRemove        ;-> D0 = 0
  296.     BCLR    #inVBL,VBLQueue+qFlags
  297.     CLR.L    (A0)    ;qLink
  298.     ADDQ.W    #1,vblCount(A0)
  299.     LEA    -vblQEl2(A0),A0
  300.     _Read    ,ASYNC
  301.     RTS
  302.  
  303.     END
  304.  
  305.